package spring_01_ioc.iocTest;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import spring_01_ioc.ioc.HelloIoc;

public class HelloInstanceFactoryTest {
	/**
     * Spring 容器利用实例工厂方法创建对象
     */
    @Test
    public void createObjectInstanceFactory(){
    	ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    	HelloIoc staticFactory = (HelloIoc) context.getBean("instance");
    	staticFactory.sayHello();
    }
    //打印结果：Hello me |Hello me |实例工厂方法构造函数 |Hello me |Hello IOC
    //第一个Hello me：<bean id="helloIoc" class="spring_01_ioc.ioc.HelloIoc"></bean>
    
    //第二个Hello me：<bean id="HelloStaticFactory" factory-method="getInstances" 
    //class="spring_01_ioc.ioc.HelloStaticFactory"></bean> HelloStaticFactory这个类里面有个静态方法。
    //在类中使用static修饰的静态方法会随着类的定义而被分配和装载入内存中；
    //而非静态方法属于对象的具体实例，只有在类的对象创建时在对象的内存中才有这个方法的代码段。
    //所以第二个一开始就被加载在内存里，便打印出Hello me。
    
    //第三个：<bean id="instanceFactory" class="spring_01_ioc.ioc.HelloInstanceFactory"></bean>
    //里面构造函数有打印。
    
    //第四个和第五个：<bean id="instance" factory-bean="instanceFactory" factory-method="getInstance"></bean>
    //调用了spring_01_ioc.ioc.HelloInstanceFactory类的getInstance方法。
    //又重新new了一个HelloIoc对象。
}
